﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Generic.Contract;
using Generic.Data.Manager;
using Contract.Business.Entity;
using Contract.Business.Filter;
using FastOdonto.Data.Entity;
using System.Data;
using FastLibrary.Criptografia;

namespace Contract.Data.Manager
{
    public class DMFuncionario : DMGeneric<BEFuncionario, FEFuncionario>
    {
        DBFastOdontoEntities2 dc;

        #region Override

        public override BEFuncionario Salvar(BEFuncionario entidade)
        {
            try
            {
                if (entidade.Codigo.Equals(0))
                    Incluir(entidade);
                else
                    Alterar(entidade);

                return entidade;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override void Excluir(BEFuncionario entidade)
        {
            try
            {
                TBFuncionario entidadeBanco = new TBFuncionario();
                entidadeBanco.ConvertFromBE(entidade);

                using (dc = new DBFastOdontoEntities2())
                {
                    dc.TBFuncionarios.Attach(entidadeBanco);
                    dc.DeleteObject(entidadeBanco);

                    dc.SaveChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override BEFuncionario ObterEntidade(int codigo)
        {
            try
            {
                TBFuncionario obj = null;
                using (dc = new DBFastOdontoEntities2())
                {
                    obj = dc.TBFuncionarios.Single(q => q.IDFuncionario.Equals(codigo));
                    return obj.ConvertToBE(1);
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override List<BEFuncionario> ObterTodos(FEFuncionario filter)
        {
            try
            {
                List<TBFuncionario> TBFuncionario = null;
                using (dc = new DBFastOdontoEntities2())
                {

                    var q = from e in dc.TBFuncionarios
                            where
                            (
                                (String.IsNullOrEmpty(filter.Nome) || e.NOFuncionario.Contains(filter.Nome)) &&
                                (!filter.Codigo.HasValue || e.IDFuncionario.Equals(filter.Codigo)) &&
                                (String.IsNullOrEmpty(filter.Telefone) || e.Telefone.Contains(filter.Telefone)) &&
                                (String.IsNullOrEmpty(filter.Celular) || e.Celular.Contains(filter.Celular)) &&
                                (!filter.Bloqueado.HasValue || e.STBloqueado.Equals(filter.Bloqueado)) &&
                                (!filter.Administrador.HasValue || e.STAdministrador.Equals(filter.Administrador)) &&
                                (!filter.CodigoFuncao.HasValue || e.IDFuncao.Equals(filter.CodigoFuncao))
                            )
                            select e;

                    TBFuncionario = q.ToList();

                    List<BEFuncionario> retorno = new List<BEFuncionario>();

                    foreach (TBFuncionario de in TBFuncionario)
                        retorno.Add(de.ConvertToBE(1));

                    return retorno;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Métodos Auxiliares


        public bool Logar(string usuario, string senha)
        {
            try
            {
                using (dc = new DBFastOdontoEntities2())
                {

                    var q = from e in dc.TBFuncionarios
                            where
                             e.Senha.Equals(Cript.getMD5Hash(senha)) &&
                             e.Login.Equals(usuario) &&
                             !e.STBloqueado
                            select e;

                    TBFuncionario funcionario = q.FirstOrDefault();

                    return funcionario != null;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void AlterarSenha(string usuario, string senhaAntiga, string senhaNova)
        {
            try
            {
                using (dc = new DBFastOdontoEntities2())
                {

                    var q = from e in dc.TBFuncionarios
                            where
                             e.Senha.Equals(Cript.getMD5Hash(senhaAntiga)) &&
                             e.Login.Equals(usuario) &&
                             !e.STBloqueado
                            select e;

                    TBFuncionario funcionario = q.FirstOrDefault();

                    if (funcionario == null)
                        throw new Exception("Usuário ou senha inválidos.");
                    else
                    {
                        funcionario.Senha = Cript.getMD5Hash(senhaNova);
                        dc.SaveChanges();
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void Incluir(BEFuncionario entidade)
        {
            try
            {
                using (dc = new DBFastOdontoEntities2())
                {
                    TBFuncionario de = new TBFuncionario();
                    de.ConvertFromBE(entidade);

                    dc.TBFuncionarios.AddObject(de);
                    dc.SaveChanges();

                    entidade.Codigo = de.IDFuncionario;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void Alterar(BEFuncionario entidade)
        {
            try
            {
                TBFuncionario entidadeBanco = new TBFuncionario();
                entidadeBanco.ConvertFromBE(entidade);

                using (dc = new DBFastOdontoEntities2())
                {
                    dc.TBFuncionarios.Attach(entidadeBanco);
                    dc.ObjectStateManager.ChangeObjectState(entidadeBanco, EntityState.Modified);

                    dc.SaveChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
